From: Michael Catanzaro Date: Wed, 27 Sep 2023 00:25:41 +0000 (-0500) Subject: printoperation: add some assertions X-Git-Tag: archive/raspbian/4.12.4+ds-3+rpi1^2~21^2~1^2~5 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=cbfbaef4cbfcb8f5caa2f4c10a5eb7b18b0ed15d;p=gtk4.git printoperation: add some assertions Let's assert that we schedule the idle callback exactly once. These assertions are not perfect because if the callback executes before we schedule it, then the assertion itself would be a use-after-free, since I'm using the PrinterFinder to track whether the callback that frees it has been scheduled. But in practice when using loupe's print dialog, I was noticing the callback scheduled twice before it was executed. The assertion would have caught this problem. --- diff --git a/gtk/print/gtkprintoperation-unix.c b/gtk/print/gtkprintoperation-unix.c index 4d592eeb6c..ab69e1970b 100644 --- a/gtk/print/gtkprintoperation-unix.c +++ b/gtk/print/gtkprintoperation-unix.c @@ -1056,6 +1056,7 @@ gtk_print_run_page_setup_dialog_async (GtkWindow *parent, struct _PrinterFinder { gboolean found_printer; + gboolean scheduled_callback; GFunc func; gpointer data; char *printer_name; @@ -1088,6 +1089,14 @@ find_printer_idle (gpointer data) return G_SOURCE_REMOVE; } +static void +schedule_finder_callback (PrinterFinder *finder) +{ + g_assert (!finder->scheduled_callback); + g_idle_add (find_printer_idle, finder); + finder->scheduled_callback = TRUE; +} + static void printer_added_cb (GtkPrintBackend *backend, GtkPrinter *printer, @@ -1120,7 +1129,7 @@ printer_added_cb (GtkPrintBackend *backend, } if (finder->found_printer) - g_idle_add (find_printer_idle, finder); + schedule_finder_callback (finder); } static void @@ -1139,7 +1148,7 @@ printer_list_done_cb (GtkPrintBackend *backend, * above, then we're finished. */ if (finder->backends == NULL && !finder->found_printer) - g_idle_add (find_printer_idle, finder); + schedule_finder_callback (finder); } static void @@ -1229,7 +1238,7 @@ find_printer (const char *printer, if (finder->backends == NULL) { - g_idle_add (find_printer_idle, finder); + schedule_finder_callback (finder); return; }